/**
 * @Copyright:Copyright (c) 1992 - 2015
 * @Company: TengTong
 */
package com.tengtong.duang.commons.collections;

import java.lang.reflect.Array;
import java.util.Optional;
import java.util.function.Consumer;

/**
 * 工具类，与 ArrayWrapper 不同，本类只提供数组的处理工具。
 *
 * @author jai
 * @since: v1.0
 */
public class ArrayUtils {

	/**
	 * 判断一个数组是空 或者 null
	 *
	 * @param datas 要判断的数据
	 * @return  如果是 null 或 空，则返回 true, 否则返回 false
	 */
	public static <T> boolean isNullOrEmpty(T[] datas){
		return (datas == null || datas.length <= 0);
	}
	
	/**
	 * 判断一个数组非空
	 *
	 * @param datas 要判断 的数组
	 * @return  如果非空返回 true, 否则返回 false
	 */
	public static <T> boolean notNullAndEmpty(T[] datas){
		return !isNullOrEmpty(datas);
	}

	/**
	 * 数组非空才去做，空什么也不做
	 *
	 * @param consumer
	 */
	public static <T> void ifPresent(T[] datas, Consumer<T[]> consumer){
		 Optional.of(datas).ifPresent(consumer);
	}
	
	/**
	 * 创建一个泛型数组
	 *
	 * @param clazz
	 * @param length
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static <T> T[] newSimpleArray(Class<T> clazz, int length){
		return (T[]) Array.newInstance(clazz, length);
	}
	
	/**
	 * 来自于 Spring Framework
	 * 
	 * Convert the given array (which may be a primitive array) to an
	 * object array (if necessary of primitive wrapper objects).
	 * <p>A {@code null} source value will be converted to an
	 * empty Object array.
	 * @param source the (potentially primitive) array
	 * @return the corresponding object array (never {@code null})
	 * @throws IllegalArgumentException if the parameter is not an array
	 */
	public static Object[] toObjectArray(Object source) {
		if (source instanceof Object[]) {
			return (Object[]) source;
		}
		if (source == null) {
			return new Object[0];
		}
		if (!source.getClass().isArray()) {
			throw new IllegalArgumentException("Source is not an array: " + source);
		}
		int length = Array.getLength(source);
		if (length == 0) {
			return new Object[0];
		}
		Class wrapperType = Array.get(source, 0).getClass();
		Object[] newArray = (Object[]) Array.newInstance(wrapperType, length);
		for (int i = 0; i < length; i++) {
			newArray[i] = Array.get(source, i);
		}
		return newArray;
	}
	
}
